
package pec4.tds.conexion;

import pec4.tds.coordinador.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import i18n.TDSLanguageUtils;
import java.net.*;
import java.rmi.*; 
import java.rmi.registry.Registry;
import java.util.Locale;
import java.util.ResourceBundle;
import java.rmi.registry.LocateRegistry;


/**
 
  * Implementación Interficie Servidor
  *
  */


public class Servidor extends JFrame {
    
   
private final Log log = Log.getInstance();
	
private final JPanel panelMsgEstado = new JPanel();
	
private final JLabel labelMsgEstado = new JLabel(TDSLanguageUtils.getMessage("panelMsgEstado.labelMsgEstado"));
	
private final JPanel panelBotones = new JPanel();
	
private final JButton botonIniciar = new JButton(TDSLanguageUtils.getMessage("panelBotones.botonIniciar"));
	
private final JButton botonParar = new JButton(TDSLanguageUtils.getMessage("panelBotones.botonParar"));

 private final int PORT = 1099;
 private final String JNDI_NAME = "RemoteServer";    

/**
     
  * Constructor de la clase.Genera los elementos de la interface gráfica
    
  */
   

 public Servidor()
    {
        
log.escribe(TDSLanguageUtils.getMessage("servidor.log.iniciando"));
        
panelBotones.setBorder(new EmptyBorder(5,5,5,5));
		
panelBotones.add(botonIniciar);
		
panelBotones.add(botonParar);
		
botonIniciar.addActionListener(new botonIniciarListener());
		
botonParar.addActionListener(new botonPararListener());
		
botonParar.setEnabled(false);

		
panelMsgEstado.setBorder(new EmptyBorder(5,5,5,5));
		
panelMsgEstado.add(labelMsgEstado);

		
this.setBounds(100,100,400,120);
		
this.setTitle(TDSLanguageUtils.getMessage("servidor.title"));
		this.setLayout(new BorderLayout());
		this.add(BorderLayout.SOUTH, panelBotones);
		this.add(BorderLayout.CENTER, panelMsgEstado);
        this.addWindowListener(new ServidorListener());

		//posicionamos la ventana y hacemos que no se pueda modificar el tamaño
        int posX = ((int)getToolkit().getScreenSize().getWidth() / 2) -  (this.getWidth() / 2);
		int posY = ((int)getToolkit().getScreenSize().getHeight() / 2) -  (this.getHeight() / 2);
		this.setLocation(posX, posY);
		this.setResizable(false); //descomentar, ahora comentado para debug
        log.escribe(TDSLanguageUtils.getMessage("servidor.log.pant_abierta"));
    }

    private class ServidorListener extends WindowAdapter {
		public void windowClosing(WindowEvent e) {
			System.exit(0);
		}
	}

    private class botonIniciarListener implements ActionListener
    {
		public void actionPerformed(ActionEvent e) {
			if(iniciarServidor())
            {
                labelMsgEstado.setText(TDSLanguageUtils.getMessage("panelMsgEstado.labelMsgEstado2")); //servidor inciado de forma correcta
                botonParar.setEnabled(true);
                log.escribe(TDSLanguageUtils.getMessage("panelMsgEstado.labelMsgEstado2"));
            }
		}
	}


/**
 * Función que inicia el Servidor
 * @return Booleano de inicio correcto o no
 */
    private boolean iniciarServidor()
    {
         boolean ok=false;
        botonIniciar.setEnabled(false);

        try {
            System.out.println("Iniciando servidor RMI...");
            Registry registry = LocateRegistry.createRegistry(PORT);
            RemotoImpl remotoImpl = new RemotoImpl();
            registry.rebind(JNDI_NAME, remotoImpl);
            System.out.println("Servidor iniciado!");
            ok=true;
            log.escribe(TDSLanguageUtils.getMessage("servidor.log.activando_remoto"));
		} catch (RemoteException e) {
            labelMsgEstado.setText(TDSLanguageUtils.getMessage("panelMsgEstado.labelMsgEstado.error1")); //error conexion
			log.escribe(TDSLanguageUtils.getMessage("panelMsgEstado.labelMsgEstado.error1"));
            //e.printStackTrace(System.out);
		} catch (Exception e) {
            labelMsgEstado.setText(TDSLanguageUtils.getMessage("panelMsgEstado.labelMsgEstado.error2")); //error URL
			log.escribe(TDSLanguageUtils.getMessage("panelMsgEstado.labelMsgEstado.error2"));
            //e.printStackTrace(System.out);
		}

        return ok;
    }

    private class botonPararListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			if(detenerServidor())
            {
               labelMsgEstado.setText(TDSLanguageUtils.getMessage("panelMsgEstado.labelMsgEstado3")); //servidor detenido de forma correcta
               botonIniciar.setEnabled(true);
               log.escribe(TDSLanguageUtils.getMessage("panelMsgEstado.labelMsgEstado3"));
            }
		}
	}

/**
 * Función que detiene el Servidor
 * @return Booleano de inicio correcto o no
 */
    private boolean detenerServidor()
    {
        boolean ok=false;
        botonParar.setEnabled(false);
        labelMsgEstado.setText(TDSLanguageUtils.getMessage("panelMsgEstado.labelMsgEstado.deteniendo")); //deteniendo servidor...
        log.escribe(TDSLanguageUtils.getMessage("panelMsgEstado.labelMsgEstado.deteniendo"));
        try{
			Naming.unbind("RemotoInterface");
            ok=true;
		} catch (RemoteException e) {
            labelMsgEstado.setText(TDSLanguageUtils.getMessage("panelMsgEstado.labelMsgEstado.error1")); //error conexion
            log.escribe(TDSLanguageUtils.getMessage("panelMsgEstado.labelMsgEstado.error1"));
            //e.printStackTrace(System.out);
		} catch(Exception e){
            labelMsgEstado.setText(TDSLanguageUtils.getMessage("panelMsgEstado.labelMsgEstado.error3")); //error aplicación
            log.escribe(TDSLanguageUtils.getMessage("panelMsgEstado.labelMsgEstado.error3"));
        }

        return ok;
    }

/**
 * Arranca la pantalla del servidor
 */
	public void iniciar() {
		this.setVisible(true);

	}

/**
 * Arranca la pantalla del servidor
 * @param args the command line arguments
 */
    public static void main(String[] args)
    {
        TDSLanguageUtils.setDefaultLanguage("i18n/messages"); //iniciamos el idioma por defecto
        Servidor interfaceServidor = new Servidor();
		interfaceServidor.iniciar();
    }

}
